package aterrizar;

import java.io.InputStream;
import java.util.Properties;

public enum CategoriaAvion {

	AVION_LARGA_DISTANCIA("largaDistancia"),
	AVION_MEDIA_DISTANCIA("mediaDistancia"),
	AVION_CORTA_DISTANCIA("cortaDistancia");
	
	private static final String ARCHIVO_PROPIEDADES = "/categoriasAvion.properties";

	private int minimaDistancia;
	private int maximaDistancia;
	private int intervalos;
	private int tiempoEntreEscalas;
	private int tiempoParado;
	private static Properties propiedades; 

	{
		if (CategoriaAvion.propiedades == null) { 
			CategoriaAvion.propiedades = new Properties();
			InputStream archivo;
			
			try {
				archivo = getClass().getResourceAsStream(ARCHIVO_PROPIEDADES);
				CategoriaAvion.propiedades.load(archivo);
				archivo.close();
			} catch (Exception e) {
				//throw new CategoriaAvionInfructuosa();
				
				/**
				 * No hay forma de cargar el Properties lanzando Excepciones
				 * El compilador no permite que un Enum lanze excepciones 
				 */
				e.printStackTrace();
			}
		}
	}
	
	private CategoriaAvion(String categoria) {
		this.minimaDistancia = Integer.parseInt(CategoriaAvion.propiedades.getProperty(categoria + ".minDistancia"));
		this.maximaDistancia = Integer.parseInt(CategoriaAvion.propiedades.getProperty(categoria + ".maxDistancia"));
		this.intervalos = Integer.parseInt(CategoriaAvion.propiedades.getProperty(categoria + ".intervalos"));
		this.tiempoEntreEscalas = Integer.parseInt(CategoriaAvion.propiedades.getProperty(categoria + ".tiempoEntreEscalas"));
		this.tiempoParado = Integer.parseInt(CategoriaAvion.propiedades.getProperty(categoria + ".tiempoParado"));
	}

	/**
	 * @return Distancia minima en Km
	 */
	public int getMinimaDistancia() {
		return minimaDistancia;
	}

	/**
	 * @return Distancia maxima en Km
	 */
	public int getMaximaDistancia() {
		return maximaDistancia;
	}

	public int getIntervalos() {
		return intervalos;
	}

	/**
	 * @return Tiempo maximo entre escalas, en horas
	 */
	public int getTiempoEntreEscalas() {
		return tiempoEntreEscalas;
	}

	/**
	 * @return Tiempo parado por revision tecnicas, en minutos
	 */
	public int getTiempoParado() {
		return tiempoParado;
	}

	/**
	 * @param distancia
	 * @return <code>true</code> si la distancia corresponde al rango de distancias
	 * validas para esta categoria
	 */
	public boolean comprobarDistancia(double distancia) {
		return minimaDistancia <= distancia && distancia <= maximaDistancia;
	}
	
	/**
	 * @return La maxima distancia de todas las categorias
	 */
	public static double getMaximaDistanciaCategoria() {
		double maximo = 0;
		for (CategoriaAvion categoria : CategoriaAvion.values()) {
			if (maximo < categoria.getMaximaDistancia())
				maximo = categoria.getMaximaDistancia();
		}
		return maximo;
	}
}
